home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 4 / Apprentice-Release4.iso / Source Code / Libraries / DCLAP 4j / DClap / DFile.cpp < prev    next >
Encoding:
Text File  |  1995-12-17  |  10.8 KB  |  545 lines  |  [TEXT/R*ch]

  1. // DFile.cp
  2.  
  3.  
  4. #include <ncbi.h>
  5. #include <dgg.h>
  6. #include "DFile.h"
  7. #include "Dvibrant.h"
  8. #include "DId.h"
  9. #include <stdio.h>
  10.  
  11. #if defined(OS_DOS) || defined(OS_NT)
  12. #include <dir.h>
  13. #include <dos.h>
  14. #endif
  15.  
  16. // class DFileManager
  17. // made into all static methods, Dec94
  18.  
  19. DFileManager*        gFileManager = NULL;
  20.  
  21. const char* DFileManager::kUntitled = "Untitled";
  22.  
  23. char    DFileManager::fName[640];
  24.  
  25. const char* DFileManager::GetInputFileName( const char* extension,  const char* mactype)
  26. {
  27.     Boolean okay= Nlm_GetInputFileName( (char*)fName, 256, (char*)extension, (char*)mactype);
  28.     if (okay) return fName;
  29.     else return NULL;
  30. }
  31.  
  32. const char* DFileManager::GetOutputFileName( const char* defaultname) 
  33. {
  34.     Boolean okay=  Nlm_GetOutputFileName( (char*)fName, 256, (char*)defaultname);
  35.     if (okay) return fName;
  36.     else return NULL;
  37. }
  38.  
  39. const char* DFileManager::GetFolderName()
  40. {
  41.     // this is a quick hack -- currently this selects a file w/in a folder,
  42.     // then chops filename off -- confusing to users, need folder select dialog
  43.     Boolean okay= Nlm_GetInputFileName( (char*)fName, 256, NULL, NULL);
  44.     if (okay) return DFileManager::PathOnlyFromPath(fName);
  45.     else return NULL;
  46. }
  47.     
  48. const char* DFileManager::GetProgramPath()
  49. {
  50.     Nlm_ProgramPath( (char*)fName, 512);
  51.     return fName;
  52. }
  53.  
  54. const char* DFileManager::FilenameFromPath( const char* pathname)
  55. {
  56.     return Nlm_FileNameFind( (char*)pathname);         
  57. }
  58.  
  59. const char* DFileManager::PathOnlyFromPath( const char* pathname)
  60. {
  61.     char* nameonly= Nlm_FileNameFind( (char*)pathname);
  62.     long len= StrLen(pathname) - StrLen(nameonly);
  63.     StrNCpy(fName, pathname, len);
  64.     fName[len]= 0;
  65.     return fName;
  66. }
  67.  
  68.  
  69.  
  70. short DFileManager::FileOrFolderExists( const char* pathname)
  71. {
  72.  
  73. #ifdef OS_MAC
  74.     long    theDirID;
  75.     Boolean isFolder = false;
  76.     char    namebuf[256];
  77.     
  78.     StrNCpy(namebuf, pathname, sizeof(namebuf));
  79.     Nlm_CtoPstr( namebuf);
  80.     short err= GetDirID( 0, 0, namebuf, &theDirID, &isFolder);
  81.     if (err == 0) {
  82.         if (isFolder) return kIsFolder;
  83.         else return kIsFile;
  84.         }
  85.     else return kNothing;
  86. #endif
  87.     
  88. #ifdef OS_UNIX
  89.     struct stat    statbuf;
  90.   if (! stat( pathname, &statbuf)) {
  91.         if ( S_ISDIR(statbuf.st_mode)) return kIsFolder;
  92.         else return kIsFile;
  93.         }
  94.     else return kNothing;
  95. #endif
  96.  
  97. #if defined(OS_DOS) || defined(OS_NT)
  98. #ifdef COMP_SYMC
  99.   FIND* finfo= findfirst( pathname, FA_RDONLY | FA_DIREC);
  100.   if (finfo) {
  101.         if ( finfo->attribute & FA_DIREC) return kIsFolder;
  102.         else return kIsFile;
  103.     }
  104. #else
  105. #if defined(OS_DOS)
  106.     struct  ffblk  finfo;
  107.     
  108.   MemFill( &finfo, 0, sizeof(finfo));
  109.     short err= findfirst( pathname, &finfo, FA_RDONLY | FA_DIREC);
  110.     if (err==0) {
  111.         if ( finfo.ff_attrib & FA_DIREC) return kIsFolder;
  112.         else return kIsFile;
  113.         }
  114.     else return kNothing;
  115. #endif
  116. #endif
  117. #endif
  118.  
  119. // for others...
  120.     return FileExists( pathname);
  121. }
  122.  
  123.  
  124. Boolean DFileManager::FileExists( const char* pathname)
  125. {
  126.     FILE* aFile= Nlm_FileOpen( (char*)pathname, "r");
  127.     if (aFile) {
  128.         Nlm_FileClose( aFile);
  129.         return true;
  130.         }
  131.     else
  132.         return false;
  133. }
  134.  
  135. char*    DFileManager::TempFilename( char* namestore)
  136. {
  137.     return Nlm_TmpNam( namestore);
  138. }
  139.         
  140. Boolean DFileManager::CreateFolder( const char* pathname)
  141. {
  142.     return Nlm_CreateDir( (char*) pathname);
  143. }
  144.  
  145.  
  146.  
  147. const char* DFileManager::BuildPath(const char* rootpath, const char* subfolder, const char* filename)
  148. {
  149.     if (rootpath) StrNCpy(fName, rootpath, 256);
  150.     else fName[0]= 0;
  151.     return Nlm_FileBuildPath(fName, (char*) subfolder, (char*) filename);
  152. }
  153.  
  154.  
  155. void DFileManager::UnixToLocalPath(char*& pathname)
  156. {
  157.     if (!pathname || !*pathname) return;
  158. #ifndef OS_UNIX
  159. #ifdef OS_VMS
  160.     // can't handle this yet .. can stdio calls under vms translate unix/style/paths?
  161. #else
  162. #ifdef OS_MAC
  163.     char buf[512], *np = buf, c;
  164.     char* cp= pathname;
  165.     long  n = 0;
  166.     
  167.     if (*cp == '/') cp++;         // absolute: start at 1st pathname
  168.     else { *np++= DIRDELIMCHR; n++; }     // relative: must insert DIRDEL before start !
  169.     do {
  170.         c= *cp++;
  171.         if (c == '/') c= DIRDELIMCHR;
  172.         *np++ = c; 
  173.         n++;
  174.     } while (c);
  175.     MemCpy(pathname, buf, n); // risky !!
  176.  
  177. #else
  178.     // MDOS, other?
  179.     char* cp= pathname;
  180.     do {
  181.         cp= StrChr( cp, '/');
  182.         if (cp) *cp++= DIRDELIMCHR; 
  183.     } while (cp);
  184. #endif
  185. #endif
  186. #endif
  187. }
  188.  
  189. const char* DFileManager::FileSuffix(const char* pathname)
  190. {
  191.   long     len = StrLen(pathname);
  192.   char* cp = (char*)pathname + len;
  193.   while (cp > pathname && *cp != DIRDELIMCHR) {
  194.         if (*cp == '.') return cp;
  195.         cp--;
  196.       }
  197.   return NULL;
  198. }
  199.  
  200.  
  201. void DFileManager::ReplaceSuffix(char* filename, long maxname, const char* suffix)
  202. {
  203.     long curlen, newlen;
  204.     char* psuf= (char*)FileSuffix(filename);
  205.     if (suffix) newlen= StrLen(suffix) + 1;
  206.   else newlen= 0;
  207.     if (psuf) {
  208.         curlen= StrLen(filename) - StrLen(psuf);
  209.         if (newlen > maxname - curlen) newlen= maxname - curlen;
  210.         if (suffix) StrNCpy( psuf, suffix, newlen);
  211.         else *psuf= 0;
  212.         }
  213.     else if (suffix) {
  214.         curlen= StrLen(filename);
  215.         if (newlen > maxname - curlen) newlen= maxname - curlen;
  216.         if (suffix) StrNCat( filename, suffix, newlen);
  217.         }
  218. }
  219.  
  220.  
  221.  
  222.  
  223.  
  224. //class DFile : public DObject
  225.  
  226.     
  227. DFile::DFile() 
  228. {
  229.     fFile= NULL;
  230.     fName= NULL;
  231.     fMode= StrDup("r");
  232.     fType= NULL;
  233.     fSire= NULL;
  234.     fEof= true;
  235. }
  236.  
  237.     
  238. DFile::DFile(const char* filename, const char* openmode,  
  239.                         const char* type, const char* creator)
  240. {
  241.     fFile= NULL;
  242.     fName= NULL;
  243.     fMode= NULL;
  244.     fType= NULL;
  245.     fSire= NULL;
  246.     fEof= true;
  247.     Initialize( filename, openmode, type, creator);
  248. }
  249.  
  250. void DFile::Initialize(const char* filename, const char* openmode,
  251.                         const char* type, const char* creator)
  252. {
  253.     char* name= StrDup( (char*) filename); // do before free in case these are some of self's data
  254.     char* mode= StrDup( (char*) openmode);
  255.     if (fFile) Close(); 
  256.     if (fName) MemFree(fName);
  257.     if (fMode) MemFree(fMode);
  258.     fName= name;
  259.     fMode= mode;
  260.     fType= (char*)type;
  261.     fSire= (char*)creator;
  262.     fEof= true;
  263. }
  264.     
  265. DFile::~DFile() 
  266. {
  267.     if (fFile) Close();
  268.     MemFree( fName);
  269.     MemFree( fMode);
  270. }
  271.  
  272. Boolean DFile::suicide(void) 
  273.     if (GetOwnerCount() <= 1) { 
  274.         delete this; 
  275.         return true; 
  276.         }
  277.     else 
  278.         return DObject::suicide();
  279. }
  280.  
  281. Boolean DFile::suicide(short ownercount)
  282. {
  283.     if (ownercount < 1) {
  284.         delete this; 
  285.         return true; 
  286.         }
  287.     else 
  288.         return DObject::suicide(ownercount);
  289. }
  290.  
  291. Boolean DFile::Exists()
  292. {
  293. #if 1
  294.     if (fFile) return true; // this is only around if file exists
  295.     else if (!fName) return false;
  296.     else {
  297.         short kind= DFileManager::FileOrFolderExists(fName);
  298.         if (kind == DFileManager::kIsFile) return true;
  299.         else if (kind == DFileManager::kIsFolder) return false; //?? what to do?? false or true?
  300.         else return DFileManager::FileExists(fName); // try another test?
  301.         }
  302. #else
  303.     if (fFile) return true;
  304.     else if (!fName) return false;
  305.     else {
  306.         Boolean exists;
  307.             // !! can't use w/ fOpen mode -- wipes out data if "w" is mode
  308.         if (fMode && *fMode == 'r') {
  309.             fFile= Nlm_FileOpen(fName, fMode);
  310.             exists= (fFile != NULL);
  311.             }
  312.         else {
  313.             fFile= Nlm_FileOpen(fName, "r");
  314.             exists= (fFile != NULL);
  315.             Close();
  316.             }            
  317.         return exists;
  318.         }
  319. #endif
  320. }
  321.  
  322. void DFile::Create(const char* filetype, const char* creator)
  323. {
  324.     // this doesn't delete existing file...! on MacOS
  325.     fType= (char*)filetype;
  326.     fSire= (char*)creator;
  327. #ifndef OS_MAC
  328.  if (! DFileManager::FileExists(fName))
  329. #endif
  330.     Nlm_FileCreate(fName, (char*)filetype, (char*)creator);
  331. }
  332.  
  333. Boolean DFile::Delete()
  334. {
  335.     Close();
  336.     return Nlm_FileRemove(fName);
  337. }
  338.  
  339. Boolean DFile::Rename(const char* newname)
  340. {
  341.     //?? can we leave file open during this?
  342.     Boolean okay= Nlm_FileRename(fName, (char*)newname);
  343.     if (okay) {
  344.         MemFree(fName);
  345.         fName= StrDup(newname);
  346.         }
  347.     return okay;
  348. }
  349.  
  350. void DFile::SetMode(const char* openmode)
  351. {
  352.     if (openmode && StringCmp(openmode, fMode) != 0) {
  353.         Nlm_FileClose( fFile);
  354.         char* mode= StrDup( (char*) openmode);
  355.         MemFree(fMode);
  356.         fMode= mode;
  357.         }
  358. }
  359.  
  360.         // result in all funcs here is error code or 0
  361. short DFile::Open(const char* openmode)
  362. {
  363.     if (openmode) {
  364.         if (StringCmp(openmode, fMode) == 0) 
  365.             openmode= NULL;
  366.         else {
  367.             char* mode= StrDup( (char*) openmode);
  368.             if (fMode) MemFree(fMode);
  369.             fMode= mode;
  370.             }
  371.         }
  372.     if (fFile) 
  373.         if (openmode) {
  374.             Nlm_FileClose( fFile);
  375.             fFile= Nlm_FileOpen(fName, fMode);
  376.             }
  377.         else fseek(fFile, 0, 0); // reset
  378.     else {
  379.         if ((fSire || fType) && (*fMode == 'w' || *fMode == 'a'))
  380.             Create( fType, fSire);
  381.         fFile= Nlm_FileOpen(fName, fMode);
  382.         }
  383.     fEof= (fFile == NULL);
  384.     return (fFile) ? 0 : -1;
  385. }
  386.  
  387.  
  388. short DFile::Close()
  389. {
  390.     if (fFile) Nlm_FileClose( fFile);
  391.     fEof= true;
  392.     fFile= NULL;
  393.     return 0;
  394. }
  395.  
  396. short DFile::GetDataLength(ulong& filelen)
  397. {
  398.     filelen= Nlm_FileLength(fName);
  399.     return 0; // any error code is trapped in Nlm_
  400. }
  401.  
  402. short DFile::GetDataMark(ulong& fileindex)
  403. {
  404.     // not yet available in ncbi toolkit...
  405.     short err= 0;
  406.     fileindex= 0;
  407.     if (!fFile) return -1;
  408.     long findex= ftell(fFile);
  409.     if (findex<0) {
  410.         err= findex;
  411.         fileindex= 0;
  412.         }
  413.     else
  414.         fileindex= findex;
  415.     return err;
  416. }
  417.  
  418. short DFile::SetDataMark(ulong    fileindex)
  419. {
  420.             // not yet available in ncbi toolkit...
  421.     if (!fFile) return -1;
  422.     else return fseek(fFile, fileindex, 0);
  423. }
  424.  
  425.  
  426. Boolean DFile::EndOfFile()
  427. {
  428.     if (!fFile) return -1;
  429.     else {
  430.         if (!fEof) fEof= feof(fFile); // !! need this !! this isn't always RIGHT !!
  431.         return fEof;
  432.         }
  433. }
  434.  
  435. short DFile::GetFileType(long& fileType) 
  436. {
  437.         // this is a silly hack -- needs work?
  438.     if (fMode && strchr(fMode,'t')) fileType= cTEXT;
  439.     else fileType= 0;
  440.     return 0;
  441. }
  442.  
  443. short DFile::ReadData( void* buffer, ulong& count) 
  444. {
  445.     long newcount= Nlm_FileRead(buffer, 1, count, fFile);
  446.     if (newcount == count) return 0;
  447.     else { 
  448.         if (newcount==0) fEof= true;
  449.         count= newcount; 
  450.         return -1; 
  451.         } 
  452. }
  453.  
  454. short DFile::ReadLine( char* line, ulong count) 
  455. {
  456.     void *buf= Nlm_FileGets(line, count, fFile);
  457.     if (buf) return 0;
  458.     else {
  459.         fEof= true;
  460.         return -1;
  461.         }
  462. }
  463.  
  464.  
  465. short DFile::ReadUntil( void* buffer, ulong& count, char stopchar) 
  466. {
  467.                 // no ncbi proc for this...
  468.     register int    c;
  469.     register char* bp = (char*) buffer;
  470.     long maxcount= count;
  471.  
  472.     if (!fFile || !buffer) return -1;
  473.     count= 0;
  474.     while (true) {
  475.         c = fgetc( fFile);
  476.         if (c<0) {
  477.             //if (c == EOF) 
  478.             fEof= true;
  479.             return c;
  480.             }
  481.         else {
  482.             *bp++= c;
  483.             count++;
  484.             if (c == stopchar || count >= maxcount)  
  485.                 return 0; // ?? do we stuff stopchar into buffer?
  486.             }
  487.         }
  488.     return 0;
  489. }
  490.  
  491.  
  492. short DFile::WriteLine( char* line, Boolean addNewline) 
  493. {
  494.     short result;
  495.     result= Nlm_FilePuts( line, fFile);
  496.     if (addNewline) result += Nlm_FilePuts( LineEnd, fFile);
  497.     return result;
  498. }
  499.  
  500. short DFile::WriteData( void* buffer, ulong& count)
  501. {
  502.     ulong newcount= Nlm_FileWrite(buffer, 1, count, fFile);
  503.     if (count != newcount) { count= newcount; return -1; } //??
  504.     else return 0;
  505. }
  506.  
  507.  
  508.  
  509. // class DTempFile
  510.  
  511. DTempFile::DTempFile() : 
  512.     DFile()
  513. {
  514.     // ?? text/binary mode flag
  515.     char    namestore[512];
  516.     Initialize( gFileManager->TempFilename(namestore), "a", NULL, NULL);
  517.     Open();
  518. }
  519.     
  520. DTempFile::~DTempFile()
  521. {
  522.     Delete();
  523. }    
  524.  
  525. char* DTempFile::ReadIntoMemory(ulong& bytesread, Boolean deleteAfterRead)
  526. {
  527.     short     err;
  528.     ulong    count;
  529.     char    * data;
  530.     
  531.     Open("r");
  532.     err= GetDataLength( count);
  533.     data= (char*) MemNew( count+1);
  534.     if (data) {
  535.         err= ReadData( data, count);
  536.         bytesread= count;
  537.         data[count]= 0; // add null term
  538.         }
  539.     Close();
  540.     if (deleteAfterRead) Delete();
  541.     return data;
  542. }
  543.  
  544.